package Datenbank;

import java.sql.*;
import java.util.Vector;
import Applikationslogik.*;

/**
 * Bildet Objekte des Typs Alarm auf der relationalen Datenbank ab.
 * Die Klasse beinhaltet Methoden und Objekte zum Anlegen, Ändern, Löschen und Suchen.
 *
 * @author Daniel Mossiossian & René van Straaten
 */
public class AlarmMapper {

    private static AlarmMapper alarmMapper = null;

    /**
     * Stellt sicher, dass nur eine Istanz von AlarmMapper erzeugt wird.
     *
     * @return alarmMapper das alarmMapper -Objekt
     */
    public static AlarmMapper AlarmMapper() {
        if (alarmMapper == null) {
            alarmMapper = new AlarmMapper();
        }
        return alarmMapper;
    }

    /**
     * Fügt ein neues Alarm- Objekt in die Datenbank ein.
     * Dabei wird auch überprüft, welche die bisher höhste alarm_id
     * (der Primärschlüssel) ist.
     *
     * @param al das zu speichernde Alarm- Objekt
     * @return al das bereits übergebene Objekt, jedoch mit ggf. korrigierter alarm_id vom Typ Alarm
     */
    public Alarm insert(Alarm al) {
        Connection con = DBConnection.connection();
        try {
            Statement stmt = con.createStatement();
            //Hier wird überprüft welche alarm_id bisher die höhste ist           
            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(alarm_id) AS maxid " +
                    "FROM Alarm");
            if (rs.next()) {
                try {
                    // Hier wird die bisher höhste vorhandene alarm_id um 1 erhöht.                    
                    al.set_alarm_id(rs.getInt("maxid") + 1);
                    stmt = con.createStatement();
                    // Die tatsächliche Einfügeoperation mit den übergebenden Attributen.
                   
                    stmt.executeUpdate("INSERT INTO Alarm (alarm_id,bezeichnung,person_id,zeitpunkt) VALUES (" +
                            al.get_alarm_id() + ",'" +
                            al.get_bezeichnung() + "'," +
                            al.get_person_id()+ ",'" +
                            al.get_zeitpunkt() + "')");

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        // Rückgabe des angelegten Objekts al von Typ Alarm
        return al;
    }

    /**
     * Aktualisiert den Alarm in der Datenbank.
     *
     * @param al das zu aktualisierende Alarm- Objekt
     * @return al das übergebende Objekt vom Typ Alarm
     */
    public Alarm update(Alarm al) {
        //Stellt durch Aufruf der connection() Methode der DBConnection-Klasse, die Verbindung zur Datenbank her.
        Connection con = DBConnection.connection();

        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            //Statement wird ausgefüllt und als Query an die DB geschickt.
            stmt.executeUpdate("UPDATE Alarm " +
                    "SET alarm_id=" + al.get_alarm_id() + ", " +
                    "bezeichnung='" + al.get_bezeichnung() + "', " +
                    "person_id=" + al.get_person_id() + ", " +
                    "zeitpunkt='" + al.get_zeitpunkt() + "' " +
                    "WHERE alarm_id=" + al.get_alarm_id());

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // das als Parameter übergebende Objekt des Typs Alarm wird zurückgegeben
        return al;
    }

    /**
     * Löscht alle Daten eines Alarm- Objekts aus der Datenbank.
     *
     * @param al das zu löschende Alarm- Objekt
     */
    public void delete(Alarm al) {
        Connection con = DBConnection.connection();
        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            // Werden alle Einträge in der Person Tabelle gelöscht
            stmt.executeUpdate("DELETE FROM Alarm " +
                    "WHERE alarm_id=" + al.get_alarm_id());
        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Findet alle Alarme für eine Person.
     * 
     * @param x 
     * @return result Ergebnisvektor mit den Alarmen für eine Person vom Typ Alarm
     */
    public Vector <Alarm> findall_alarm_by_person(int x) {
        Connection con = DBConnection.connection();
        Vector result = new Vector();
        try {
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(

                    "SELECT * " +
                    "FROM Alarm " +
                    "WHERE person_id=" + x);

            while (rs.next()) {
                try {
                    Alarm al = new AlarmImpl();
                    al.set_alarm_id(rs.getInt("alarm_id"));
                    al.set_bezeichnung(rs.getString("bezeichnung"));
                    al.set_person_id(rs.getInt("person_id"));
                    al.set_zeitpunkt(rs.getTimestamp("zeitpunkt"));
                    result.addElement(al);
                } catch (Exception e) {
                    e.printStackTrace();
                    //Bei einer evtl. Exception wird die while-Schleife abgebrochen.
                    break;
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        // Ergebnisvektor vom Typ Alarm wird zurückgeben
        return result;
    }
}